package seqlist.queue.LeetCode;
//225. 用队列实现栈
//请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。

import java.util.LinkedList;
import java.util.Queue;

/**
 * 思路：双队列实现栈。一定要保证其中一个栈就是进行实际元素存储的，另一个栈就是作为辅助操作。
 * q1永远是存储元素的队列新元素添加到q2中，
 * 将此时q1中的所有元素出队在入队q2恰好就能实现添加顺序和出队顺序相反的操作
 */
//public class Num225_MyStack {
//    //q1永远是保存元素的队列
//    private Queue<Integer> q1 = new LinkedList<>();
//    //q2作为辅助队列，新元素直接入q2
//    private Queue<Integer> q2 = new LinkedList<>();
//
//    //向当前栈中添加元素
//    public void push(int x) {
//        //新元素直接入q2
//        q2.offer(x);
//        //将q1里面的元素依次出列入到q2中
//        while(!q1.isEmpty()){
//            q2.offer(q1.poll());
//        }
//        //此时原来的q1已经为空，交换q1和q2的引用
//        Queue<Integer> tmp = q1;
//        q1 = q2;
//        q2 = tmp;
//    }
//
//
//    //弹出，并返回栈顶值
//    public int pop() {
//        //因为我们的队列存储的时候就是逆序的，所以去头就相当于去尾
//        return q1.poll();
//    }
//    //查看栈顶的值
//    public int top() {
//        return q1.peek();
//    }
//
//    public boolean empty() {
//        return q1.isEmpty();
//    }
//}

/**
 * 用一个size记录队列里面元素个数，在正常插入一个
 * 元素后，循环size次，弹出，保留弹出数，用弹出数入队列
 */
//用一个栈来解决
public class Num225_MyStack {
    //q1永远是保存元素的队列
    private Queue<Integer> q1 = new LinkedList<>();

    //向当前栈中添加元素
    public void push(int x) {
      int size = q1.size();//里面元素的个数
      q1.offer(x);//入队列
      if(size != 0){
          for (int i = 0; i < size; i++) {
              int val = q1.poll();
              q1.offer(x);//入队列
          }
      }
      size ++;
    }

    //弹出，并返回栈顶值
    public int pop() {
        //因为我们的队列存储的时候就是逆序的，所以去头就相当于去尾
        return q1.poll();
    }
    //查看栈顶的值
    public int top() {
        return q1.peek();
    }

    public boolean empty() {
        return q1.isEmpty();
    }
}